package cn.tedu.v1_2;

import java.io.*;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

/**
 * 聊天室 Version 1.1
 * 服务器 功能：1.服务器申请端口号：软件具备端口号
 *            2.在socket方法中，等待客户端连接，返回socket
 *                             IO读入
 *     【新增】3.所有服务器端异常，全部捕获，明确提示
 *            4.关闭severSocket
 *            5.知道对方的IP---start方法---accept--返回客户端连接
 * 测试：自己连接自己  测试
 *      别人连接自己  知道对方IP
 */

public class Server {
    private ServerSocket serverSocket;
    public Server(){
        try {
            serverSocket=new ServerSocket(8898);
            //BindException    端口号已被占用
        }catch(BindException e) {
            System.out.println("请检查端口号，被占用~");
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    //3.创建 start 方法accept() 等待客户端的链接！传输数据：IO
    public void start() {
        BufferedReader br = null;
        Socket socket=null;
        try {
            System.out.println("等待客户端连接");
            socket = serverSocket.accept();
            //getInetAddress()  返回Address对象，表示远方IP地址
            //具体IP地址  getHostAddress,将远方IP地址转换为字符串
            // 未连接上返回null
            String ip=socket.getInetAddress().getHostAddress();
            System.out.println("客户端"+ip+"连接上了");

            //客户端连接服务器端--accept，返回socket对象---IO流
            InputStream   is = socket.getInputStream();//低级流，负责读入
            //高级流---转化流，目的：指定编码集：UTF8
            InputStreamReader isr = new InputStreamReader(is, "UTF8");
            //高级流--缓冲输入流
            br = new BufferedReader(isr);
            //服务器--一直读
            while (true) {
                String str = br.readLine();//获取一行字符串，交给str保存
                System.out.println("客户端：" + str);//打印  客户端发来文本
            }
        } catch (UnsupportedEncodingException e) {
            System.out.println("请检查客户端/服务器端编码集：不一致");
        }catch(SocketException e){
            System.out.println("客户端被重置");
        }catch (IOException e) {
            System.out.println("客户端连接失败了");
        } finally {
            //关闭流  关闭socket
           if (br!=null);
            try {
                br.close();
            } catch (IOException e) {
                System.out.println("读入流断开连接");
            }
            try {
                socket.close();
            } catch (IOException e) {
                System.out.println("socket客户端断开连接");
            }

        }

    }
    //4.创建主方法--服务器程序启动
    public static void main(String[] args){
        //执行：先创建Server--->调用空参构造器---->申请端口号：6666
        Server server=new Server();
        //执行：然后调用start方法--->等待客户端连接操作---进行IO流
        server.start();
    }
}
